
// 泛型：指在定义函数、接口或者类的时候不提前指定具体的数据类型 ，当使用时再指定具体的数据类

// 函数使用泛型参数
// 提前设计数据类型，直接规定了数据类型
function fo1(x:string,y:string):string{
    return x + y
}

// 没有规定数据类型
function fo2<T>(x:T,y:T):T[]{
    return [x,y]
}
//当调用时就传入数据类型
fo2<string>('SSA','阿萨');
console.log(fo2<string>('SSA','阿萨'));

fo2<number>(11,22);
console.log(fo2<number>(11,22));

//元组
function fo3<T,K>(a:T,b:K):[T,K]{
    return [a,b];
}

fo3<string,number>('sasas',142);
console.log(fo3<string,number>('sasas',142));
fo3<string,boolean>('SS手动',false);
console.log(fo3<string,boolean>('SS手动',false));

//接口定义泛型
//基本写法
// interface Person{
//     name:string,
//     age:number,
//     sex:string
// }
// let oob:Person = {
//     name:"发生的",
//     age:21,
//     sex:'男'
// }
// console.log(oob);

//泛型写法

interface Person<T,K>{
    name:T,
    age:K,
    sex:T,
}
let oob:Person<string,number>={
    name:'法大大',
    age:11,
    sex:'男'
}
console.log(oob);

//泛型类

//基本写法
/* class Animal {
    name: string;
    age: number;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    // 原型对象上的方法
    jump(str: string): string {
        return this.name + str;
    }
    // 静态方法
    static run(num: number): number {
        return num
    }
} */

// 泛型写法
class Anima1<T,K>{
    name:T;
    age:K;
    constructor(name:T,age:K){
        this.name = name;
        this.age = age;
    }
    jump(str:T):T{
        return str
    }
}
// 静态成员不能引用类类型形参
//静态成员是构造函数自身上的属性和方法 

let daHuang = new Anima1<string,number>("啥事",222);
console.log(daHuang);

//类的泛型接口
interface Ddg<T,K>{
    data:T[],
    add:(x:T,y:K)=> void
}
class Xxg implements Ddg<string,number>{
    //在每一个实例对象上都添加一个data值
    data: string[] = ['是的是的'];
    add(x:string,y:number):void{
        this.data.push(x);
        console.log(y);
    }
}
let xim = new Xxg();
console.log(xim);

//泛型约束

interface Len{
    len:number
}
function fuu11<T extends Len>(x:T){
    console.log(x.len);
}
// fuu11<string>('wwww');
// fuu11<number>(22222);
// fuu11<boolean>(false);


// ts基本数据类型
// number string Boolean  字面量 void 数组 对象 元组 never undefined null any unknown  枚举